// 函数对象
function add(a, b, c) {
    // arguments 函数运行时决定，参数总管
    // 下标访问第几个参数
    // 类数组，有length属性，for，但是没有数组太多的方法
    // console.log(arguments.map(item => item + 1)); 报错
    // 如何讲类数组转成真正的数组？
    const args = Array.from(arguments);

    console.log(arguments, arguments.length, Object.prototype.toString.call(arguments));
    return a + b + c;
}
console.log(add.length); // 3
add(1, 2, 3)
// 柯里化 手写curry 函数
function curry(fn){
    //返回一个函数
    // ...args 所有的参数 自由变量
    let judge = (...args) => {
        // es6 reset 运算符
        if(args.length === fn.length){
            // 退出条件
            return fn(...args);
        } 
        return (...newArgs) => judge(...args,...newArgs);
    }
    return judge;
}

let addCurry = curry(add) // 将一个多参数函数转换为一系列单参数函数
// 逐步去获取函数需要的参数，当到达fn需要的参数数量时，执行结果
addCurry(1)(2)(3)